package com.lcu.bos.dao.base;

import com.lcu.bos.modle.PageBean;
import com.lcu.bos.modle.Staff;
import org.hibernate.Query;
import org.hibernate.classic.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class BaseDaoImpl<T> implements IBaseDao<T>{
    @Autowired
    protected HibernateTemplate hibernateTemplate;
    // protected同包或者子类中可以用
    private Class<T> entityClass;//泛型类
    public BaseDaoImpl(){
        //1.获得父类（BaseImpl<T>）的参数化类型
        ParameterizedType genericSuperClass= (ParameterizedType) this.getClass().getGenericSuperclass();
        //2.获取父类的参数化类型的数组
        Type[] types=genericSuperClass.getActualTypeArguments();
        //3.获取泛型类的第一个参数化类型
        entityClass=(Class<T>) types[0];
    }


    @Override
    public void save(T entity) {
        hibernateTemplate.save(entity);
    }

    @Override
    public void delete(T entity) {
        hibernateTemplate.delete(entity);
    }

    @Override
    public void update(T entity) {
        hibernateTemplate.update(entity);
    }

    @Override
    public T find(Serializable id) {
        return hibernateTemplate.get(entityClass,id);
    }

    @Override
    public List<T> findAll() {
        String hql="from "+entityClass.getSimpleName();//获取类名
        System.out.println("hql:"+hql);
        return (List<T>) hibernateTemplate.find(hql);
    }

    @Override
    public List<T> findAllbyDetachedCriteria(DetachedCriteria dc) {
        return (List<T>) hibernateTemplate.findByCriteria(dc);
    }

    @Override
    public void executeUpdate(String hql, Object... objs) {
        // 获取session 与当亲线程绑定的Session不需要关闭
        Session session = hibernateTemplate.getSessionFactory().getCurrentSession();

        //获取查询查询对象
        Query query = session.createQuery(hql);
        //设置参数
        for (int i=0;i<objs.length;i++){
            query.setParameter(i,objs[i]);
        }
        //执行
        query.executeUpdate();
    }

    @Override
    public void executeUpdateByQueryName(String queryName, Object... objs) {
        // 获取session 与当亲线程绑定的Session不需要关闭
        Session session = hibernateTemplate.getSessionFactory().getCurrentSession();
        Query query = session.getNamedQuery(queryName);
        //设置参数
        for (int i=0;i<objs.length;i++){
            query.setParameter(i,objs[i]);
        }
        //执行
        query.executeUpdate();
    }

    public void saveList(List<T> lists) {
        for (T t:lists){
            hibernateTemplate.saveOrUpdate(t);
        }
    }

    @Override
    public void pageQuery(PageBean<T> pb) {
        //执行查询

        //1.查询总记录数
        //获取离线查询对象
        DetachedCriteria dc=pb.getDetachedCriteria();
        dc.setProjection(Projections.rowCount());//查询表有多少行记录
        List<Long> list = (List<Long>) hibernateTemplate.findByCriteria(dc);
        Long total=list.get(0);//总记录数
        pb.setTotal(total.intValue());//强转成int类型
        //2.查询分页数据
        dc.setProjection(null);
        dc.setResultTransformer(DetachedCriteria.ROOT_ENTITY);//重置hql  初始的查询条件
        int start=(pb.getCurrentPage()-1)*pb.getPageSize();
        int length=pb.getPageSize();
        List<T> lists = (List<T>) hibernateTemplate.findByCriteria(dc, start, length);
        pb.setRows(lists);//相当于一个杯子
    }


}
